/**
 * 页面初始化工具
 * 提供统一的页面初始化逻辑，减少页面代码冗余
 */

const DataManager = require('./data-manager')
const { createUnifiedSetData } = require('./optimizer')
const { logger } = require('./logger')
const lightModeService = require('../services/light_mode')

/**
 * 页面初始化工具
 * 提供统一的页面初始化逻辑，减少页面代码冗余
 */
const PageInitializer = {
  /**
   * 初始化设备或编组页面
   * 统一处理设备/编组页面的初始化逻辑
   *
   * @param {Object} pageContext - 页面实例 (this)
   * @param {Object} options - 配置选项
   * @param {string} options.id - 设备ID或编组ID
   * @param {boolean} options.isGroup - 是否为编组页面
   * @param {boolean} options.optimizeSetData - 是否优化setData调用
   * @param {Function} options.onSuccess - 初始化成功回调
   * @param {Function} options.onError - 初始化失败回调
   */
  initEntityPage(pageContext, options = {}) {
    if (!pageContext) {
      logger.error('初始化页面失败: 无效的页面实例')
      return
    }

    const { id, isGroup = false, optimizeSetData = true } = options

    try {
      // 优化setData调用
      if (optimizeSetData) {
        this.applySetDataOptimization(pageContext)
      }

      // 获取设备或编组数据
      let entity = null
      if (isGroup) {
        // 获取编组数据
        const groups = DataManager.getGroups()
        entity = groups.find(group => group.id === id)
      } else {
        // 获取设备数据
        const devices = DataManager.getDevices()
        entity = devices.find(device => device.id === id)
      }

      if (!entity) {
        logger.error(`初始化页面失败: ${isGroup ? '编组' : '设备'}不存在，ID: ${id}`)
        if (typeof options.onError === 'function') {
          options.onError(`${isGroup ? '编组' : '设备'}不存在`)
        }
        return
      }

      // 更新页面数据
      pageContext.setData({
        [isGroup ? 'group' : 'device']: entity,
        isGroup,
      })

      // 获取灯光模式状态
      const lightModeState = DataManager.getLightModeState(id)
      const isManualMode = lightModeState === 'manual'

      // 更新页面灯光模式状态
      pageContext.setData({
        isManualMode,
      })

      // 调用成功回调
      if (typeof options.onSuccess === 'function') {
        options.onSuccess(entity)
      }
    } catch (error) {
      logger.error('初始化页面时出错:', error)
      if (typeof options.onError === 'function') {
        options.onError(error.message || '初始化页面时出错')
      }
    }
  },

  /**
   * 初始化首页
   * 统一处理首页的初始化逻辑
   *
   * @param {Object} pageContext - 页面实例 (this)
   * @param {Object} options - 配置选项
   * @param {boolean} options.optimizeSetData - 是否优化setData调用
   * @param {Function} options.onSuccess - 初始化成功回调
   * @param {Function} options.onError - 初始化失败回调
   */
  initIndexPage(pageContext, options = {}) {
    if (!pageContext) {
      logger.error('初始化首页失败: 无效的页面实例')
      return
    }

    const { optimizeSetData = true } = options

    try {
      // 优化setData调用
      if (optimizeSetData) {
        this.applySetDataOptimization(pageContext)
      }

      // 获取设备和编组数据
      const devices = DataManager.getDevices()
      const groups = DataManager.getGroups()

      // 更新页面数据
      pageContext.setData({
        devices,
        groups,
      })

      // 调用成功回调
      if (typeof options.onSuccess === 'function') {
        options.onSuccess({ devices, groups })
      }
    } catch (error) {
      logger.error('初始化首页时出错:', error)
      if (typeof options.onError === 'function') {
        options.onError(error.message || '初始化首页时出错')
      }
    }
  },

  /**
   * 应用setData优化
   * @param {Object} pageContext - 页面实例 (this)
   */
  applySetDataOptimization(pageContext) {
    if (!pageContext) return

    // 保存原始setData方法
    const originalSetData = pageContext.setData

    // 替换为优化后的方法
    pageContext.setData = createUnifiedSetData(pageContext, {
      throttleTime: 16,
      deepCompare: false,
      enableStats: true,
      logLevel: 'warn',
    })

    // 添加恢复原始方法的功能
    pageContext._restoreOriginalSetData = function () {
      pageContext.setData = originalSetData
    }
  },

  /**
   * 获取并更新设备或编组的模式数据
   * @param {Object} pageContext - 页面实例 (this)
   * @param {string} id - 设备ID或编组ID
   * @param {boolean} isGroup - 是否为编组
   * @param {string} deviceType - 设备类型
   * @param {string} modeType - 模式类型 (modeSetting, shortcutMode, playerMode, advancedMode)
   * @param {Function} onSuccess - 成功回调
   */
  loadModeData(pageContext, id, isGroup, deviceType, modeType, onSuccess) {
    if (!pageContext || !id || !deviceType || !modeType) {
      logger.error('加载模式数据失败: 参数无效')
      return
    }

    try {
      let modeData = null

      // 根据模式类型获取数据
      switch (modeType) {
        case 'modeSetting':
          modeData = DataManager.getModeSettingData(id, isGroup, deviceType)
          break
        case 'shortcutMode':
          modeData = DataManager.getShortcutModeData(id, isGroup, deviceType)
          break
        case 'playerMode':
          modeData = DataManager.getPlayerModeData(id, isGroup, deviceType)
          break
        case 'advancedMode':
          modeData = DataManager.getAdvancedModeData(id, isGroup, deviceType)
          break
        default:
          logger.warn(`未知的模式类型: ${modeType}`)
          return
      }

      // 调用成功回调
      if (typeof onSuccess === 'function') {
        onSuccess(modeData)
      }
    } catch (error) {
      logger.error(`加载${modeType}数据时出错:`, error)
    }
  },

  /**
   * 切换灯光模式（自动/手动）
   * @param {Object} pageContext - 页面实例 (this)
   * @param {string} id - 设备ID或编组ID
   * @param {boolean} isGroup - 是否为编组
   * @param {boolean} isManual - 是否为手动模式
   * @param {string} deviceType - 设备类型
   * @param {Function} onSuccess - 成功回调
   */
  toggleLightMode(pageContext, id, isGroup, isManual, deviceType, onSuccess) {
    if (!pageContext || !id || !deviceType) {
      logger.error('切换灯光模式失败: 参数无效')
      return
    }

    try {
      // 保存灯光模式状态
      const state = isManual ? 'manual' : 'auto'
      DataManager.saveLightModeState(id, state, isGroup, deviceType)

      // 更新页面状态
      pageContext.setData({
        isManualMode: isManual,
      })

      // 调用成功回调
      if (typeof onSuccess === 'function') {
        onSuccess(isManual)
      }
    } catch (error) {
      logger.error('切换灯光模式时出错:', error)
    }
  },
}

module.exports = PageInitializer
